class M31(object):
    
    def __init__(self, mbObj, devAddr):
        self.mbObj = mbObj
        self.devAddr = devAddr
    '''---------------------------------------------------------------------------------
    写单个线圈(功能码05)
    modbus.writeCoil(slave_addr, coil_addr, coil_value, timeout)
        参数	            类型	必选参数？	说明
        slave_addr	        int	    是	        请求的从机地址，0代表广播
        coil_addr	        int	    是	        写线圈的地址
        coil_value	        int	    是	        写线圈的数据
        timeout	            int	    是	        请求超时时间，单位是毫秒（ms）
    ---------------------------------------------------------------------------------'''
    def openChannel(self, chid):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        ret = self.mbObj.writeCoil(self.devAddr, chid, 0xff00, 200)
        print('----------------')
        return ret[0]

    def closeChannel(self, chid):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        ret = self.mbObj.writeCoil(self.devAddr, chid, 0, 200)
        print('================')
        return ret[0]
    
    '''---------------------------------------------------------------------------------
    写多个线圈(功能码0F)
    modbus.writeMultipleCoils(slave_addr, start_addr, reg_quantity, data, timeout)
        参数	        类型	        必选参数？	    说明
        slave_addr	    int	            是	            请求的从机地址，0代表广播
        start_addr	    int	            是	            写线圈的地址
        reg_quantity	int	            是	            待写寄存器的数量，表示操作多少个寄存器
        data	        bytearray	    是	            写寄存器的数据，每个寄存器包含高低两个字节，高位在前，低位在后
        timeout	        int	            是	            请求超时时间，单位是毫秒（ms）
    --------------------------------------------------------------------------------------'''
    def writeMultipleCoilsChannel(self, chid):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        writeBuf=bytearray([chid])
        ret = self.mbObj.writeMultipleCoils(self.devAddr, 0,4,writeBuf, 200)
        print('================')
        return ret[0]
    '''------------------------------------------------------------------------------------
    读取多个线圈值(功能码01)
    modbus.readCoils(slave_addr, start_addr, reg_quantity, data, timeout)
        参数	        类型	     必选参数？	    说明
        slave_addr	    int	        是	            请求的从机地址，0代表广播
        start_addr	    int	        是	            待读线圈的起始地址
        reg_quantity	int	        是	            待读线圈的数量，表示操作多少个线圈
        data	        bytearray	是	            读线圈获得的数据，每个线圈包含高低两个字节，高位在前，低位在后
        timeout	        int	        是	            请求超时时间，单位是毫秒（ms）
    ------------------------------------------------------------------------------------------'''
    def getreadCoils(self):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        status = bytearray(1)
        ret = self.mbObj.readCoils(self.devAddr, 0, 4, status, 200)
        if ret[0] < 0:
            raise ValueError("modbus readCoils failed, errno:", ret[0])
        return status

    '''---------------------------------------------------------------------------------
    读取多个离散输入值(功能码02)
    modbus.readInputRegisters(slave_addr, start_addr, reg_quantity, data, timeout)
        参数	        类型	    必选参数？	    说明
        slave_addr	    int	        是	            请求的从机地址，0代表广播
        start_addr	    int	        是	            待读寄存器的起始地址
        reg_quantity	int	        是	            待读寄存器的数量，表示操作多少个寄存器
        data	        bytearray	是	            读寄存器获得的数据，每个寄存器包含高低两个字节，高位在前，低位在后
        timeout	        int	        是	            请求超时时间，单位是毫秒（ms）
    
    ---------------------------------------------------------------------------------'''

    def getreadDiscreteInputs(self):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        status = bytearray(1)
        ret = self.mbObj.readDiscreteInputs(self.devAddr, 0, 4, status, 200)
        if ret[0] < 0:
            raise ValueError("modbus readCoils failed, errno:", ret[0])
        return status
    
    '''---------------------------------------------------------------------------------
    读取多个输入寄存器值(功能码04)
    modbus.readInputRegisters(slave_addr, start_addr, reg_quantity, data, timeout)
        参数	        类型	    必选参数？	说明
        slave_addr	    int	        是	        请求的从机地址，0代表广播
        start_addr	    int	        是	        待读寄存器的起始地址
        reg_quantity	int	        是	        待读寄存器的数量，表示操作多少个寄存器
        data	        bytearray	是	        读寄存器获得的数据，每个寄存器包含高低两个字节，高位在前，低位在后
        timeout	        int	        是	        请求超时时间，单位是毫秒（ms）

    ---------------------------------------------------------------------------------'''
    def getreadInputRegisters(self):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        readBuf=bytearray(8)
        self.mbObj.readInputRegisters(self.devAddr,0,4,readBuf,200)
        print('read 4 AI:',readBuf)

    '''---------------------------------------------------------------------------------
    写多个保存寄存器(功能码10)
    modbus.writeMultipleHoldingRegisters(slave_addr, start_addr, reg_quantity, data, timeout)
        参数	        类型	    必选参数？	说明
        slave_addr	    int	        是	        请求的从机地址，0代表广播
        register_addr	int	        是	        待写寄存器的起始地址
        reg_quantity	int	        是	        待写寄存器的数量，表示操作多少个寄存器
        data	        bytearray	是	        写寄存器的数据，每个寄存器包含高低两个字节，高位在前，低位在后
        timeout	        int	        是	        请求超时时间，单位是毫秒（ms）

    ---------------------------------------------------------------------------------'''
    def wwriteMultipleHoldingRegisters(self):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        writeBuf=bytearray([0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00])
        ret = self.mbObj.writeMultipleHoldingRegisters(self.devAddr,0xdac,4,writeBuf, 200)
        print('================')
        return ret[0]
    
    '''---------------------------------------------------------------------------------
    写单个保存寄存器(功能码06)
    UART.writeHoldingRegister(slave_addr, register_addr, register_value, timeout)
        参数	        类型	必选参数？	    说明
        slave_addr	    int	    是	        请求的从机地址，0代表广播
        register_addr	int	    是	        写寄存器的地址
        register_value	int	    是	        写寄存器的数据
        timeout	        int	    是	        请求超时时间，单位是毫秒（ms）
    ---------------------------------------------------------------------------------'''
    def wwriteHoldingRegister(self):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        ret = self.mbObj.writeHoldingRegister(self.devAddr,0xdac,0, 200)
        print('================')
        return ret[0]

    '''---------------------------------------------------------------------------------
    读多个保存寄存器(功能码03)
    modbus.readHoldingRegisters(slave_addr, start_addr, reg_quantity, data, timeout)
        参数	        类型	    必选参数？	说明
        slave_addr	    int	        是	        请求的从机地址，0代表广播
        start_addr	    int	        是	        待读寄存器的起始地址
        reg_quantity	int	        是	        待读寄存器的数量，表示操作多少个寄存器
        data	        bytearray	是	        读寄存器获得的数据，每个寄存器包含高低两个字节，高位在前，低位在后
        timeout	        int	        是	        请求超时时间，单位是毫秒（ms）
    ---------------------------------------------------------------------------------'''
    def getreadHoldingRegisters(self):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        readBuf=bytearray(8)
        self.mbObj.readHoldingRegisters(self.devAddr,0xdac,4,readBuf,200)
        print('0x0DAC:',readBuf)